#include <bits/stdc++.h>
using namespace std;
struct node {
  int id;
  int value;
};
stack<node> s; // 单调栈，保证栈内元素不递增（从栈顶到栈底不递增）
int main() {
  int n;
  scanf("%d", &n);
  long long ans = 0;
  for (int i = 1; i <= n + 1; i++) {
    node x;
    if (i == n + 1) { // 设置尾部哨兵
      x.value = 1e9;
    } else {
      scanf("%d", &x.value);
    }
    x.id = i;
    // 如果当前元素大于栈顶，则栈顶元素的右边界为当前元素位置，左边界为次栈顶元素位置
    // 我们可以计算其贡献值
    while (!s.empty() && s.top().value < x.value) {
      node now = s.top(); // 取栈顶元素
      s.pop();            // 弹出栈顶元素
      int L, R = i;       // pq为左右边界
      if (!s.empty()) {   // 如果栈内非空，左边界为栈顶元素ID
        L = s.top().id;
      } else { // 否则左边界为0
        L = 0;
      }
      // 计算贡献
      ans += (long long)(R - now.id) * (now.id - L) * now.value;
    }
    s.push(x); // 当前元素入栈
  }
  cout << ans;
  return 0;
}